package co.edu.usbcali.egrapico.logica;

import java.util.StringTokenizer;

/**
 * Clase para la traducci�n de la representaci�n de un
 * <Code>Mensaje</Code> desde <I>GraPiCO Textual</I> hacia <I>C�lculo PiCO</I>.
 * <P> Recibe en <I>GraPiCO Textual</I> alguna de las opciones:<P> <Blockquote><Pre>
 *                   NombreMensaje:[ListaAplicaciones]
 *                   NombreMensaje:[]
 * </Pre></Blockquote> <P> Traducci�n a <I>C�lculo PiCO</I> de cada
 * constructor:<P> <Blockquote><Pre>
 *                   NombreMensaje:[ListaAplicaciones]
 *                   NombreMensaje:[]
 * </Pre></Blockquote>
 *
 * @author Johanna Noguera Le�n & Alejandro Berm�dez Mart�nez.
 * @version 1.0
 * @since Enero de 2005
 */
public class Message {

    // Variable para almacenar el mensaje representado en c�lculo PiCO.
    String messagePico = "";
    // Variable para almacenar el nombre del mensaje.
    String nameMessage = "";
    // Variable para almacenar una lista de aplicaciones en GraPiCO Textual.
    String applicationListGraPicoT = "";
    // Lista de aplicaciones en c�lculo PiCO
    String applicationListPiCO = "";
    // Objeto de la clase ApplicationsList
    ApplicationsList applicationsList;
    // Nombre o lista de nombres de los procesos que se est�n traduciendo.
    String nameCurrentProcess = "";

    /**
     * M�todo constructor de la clase
     * <Code>Message</Code>.<P> Toma un
     * <Code>Mensaje</Code> representado en <I>GraPiCO Textual</I> y separa la
     * parte de la expresi�n que hace referencia al nombre del
     * <Code>Mensaje</Code> con el fin de obtener la
     * <Code>Lista de Aplicaciones</Code> usando el s�mbolo de sincronizaci�n
     * ":".
     *
     * @param messageGraPicoT Expresi�n equivalente a la representaci�n de un
     * <Code>Mensaje<Code> en <I>GraPiCO Textual</I>.
     * @param nameProcess Nombre o lista de nombres de procesos.
     */
    public Message(String messageGraPicoT, String nameProcess) {

        // Se obtiene el nombre o lista de nombres de procesos.
        nameCurrentProcess = nameProcess;

        // Se obtiene el nombre del mensaje (nombre del m�todo)
        nameMessage = messageGraPicoT.substring(0, messageGraPicoT.indexOf(":"));

        // Se obtiene la lista de aplicaciones. (par�metros)
        applicationListGraPicoT = messageGraPicoT.substring(nameMessage.length() + 2, messageGraPicoT.length() - 1);

    }

    /**
     * M�todo generador de la traducci�n de un
     * <Code>Mensaje</Code>.<P> La traducci�n del
     * <Code>Mensaje</Code> hacia <I>C�lculo PiCO</I> es formada con el nombre
     * del mensaje y la traducci�n de la
     * <Code>Lista de Aplicaciones</Code> la cual debe estar entre corchetes.
     * <P> El nombre del mensaje se registra en la <I>tabla de solicitudes</I>
     * de m�todos para el an�lisis sem�ntico.
     *
     * @return el
     * <Code>Mensaje</Code> traducido a <I>C�lculo PiCO</I>.
     */
    public String traslate() {

        applicationsList = new ApplicationsList(applicationListGraPicoT, nameCurrentProcess);
        // Se obtiene la traducci�n de la lista de aplicaciones
        applicationListPiCO = applicationsList.traslate();
        // Se obtiene el n�mero de aplicaciones (par�metros de m�todo)
        StringTokenizer stApplicationsPico = new StringTokenizer(applicationListPiCO, ",");
        int nuParameters = stApplicationsPico.countTokens();
        // Se registra la solicitud del m�todo
        SemanticAnalizer.PutRequiredMethods(nameMessage, nameCurrentProcess, new Integer(nuParameters).toString());
        // Se forma la traducci�n del mensaje
        messagePico += nameMessage + ": " + "[" + applicationListPiCO + "] ";
        return messagePico;
    }
}